#ifndef __SOFT_TIMER_H__
#define __SOFT_TIMER_H__

#include "soft_timer_cfg.h"
#include "stdint.h"
#ifndef __cplusplus
#include "stdbool.h"
#endif  /* __cplusplus */
#include <pthread.h>
#include <time.h>

#if (SOFT_TIMER_CFG_CNT_BITS > 32)
/* 定时器时基类型 */
typedef uint64_t soft_timer_base_t;
/* 定时器最大定时周期 */
#define SOFT_TIMER_MAX_INTERVAL   UINT64_MAX
#elif (SOFT_TIMER_CFG_CNT_BITS > 16)
/* 定时器时基类型 */
typedef uint32_t soft_timer_base_t;
/* 定时器最大定时周期 */
#define SOFT_TIMER_MAX_INTERVAL   UINT32_MAX
#elif (SOFT_TIMER_CFG_CNT_BITS > 8)
/* 定时器时基类型 */
typedef uint16_t soft_timer_base_t;
/* 定时器最大定时周期 */
#define SOFT_TIMER_MAX_INTERVAL   UINT16_MAX
#else
/* 定时器时基类型 */
typedef uint8_t soft_timer_base_t;
/* 定时器最大定时周期 */
#define SOFT_TIMER_MAX_INTERVAL   UINT8_MAX
#endif  /* SOFT_TIMER_CFG_CNT_BITS */

/* 定时器模式 */
typedef enum
{
    SOFT_TIMER_MODE_ONCE,         /* 单次模式 */
    SOFT_TIMER_MODE_MANY,         /* 多次模式 */
    SOFT_TIMER_MODE_FOREVER,      /* 无限循环模式 */
} soft_timer_mode_t;

/* 定时器状态 */
typedef enum
{
    SOFT_TIMER_STATUS_PENDING,    /* 挂起态 */
    SOFT_TIMER_STATUS_RUNNING,    /* 运行态 */
} soft_timer_status_t;

/* 定时器类型定义，用户不要直接操作此结构成员，需要使用API调用来修改参数 */
typedef struct _soft_timer_t soft_timer_t;

/* 定时器回调函数定义 */
typedef int soft_timer_cb_t(soft_timer_t*);

/* 定时器结构 */
struct _soft_timer_t
{
    soft_timer_mode_t   mode;     /* 定时器模式 */
    soft_timer_status_t status;   /* 定时器状态 */
    soft_timer_base_t   times;    /* 重载次数，仅多次模式下使用 */
    soft_timer_base_t   interval; /* 计时周期，单位ticks */
    soft_timer_base_t   last;     /* 上一次计数溢出值 */
    soft_timer_cb_t    *cb;       /* 溢出回调函数 */
    soft_timer_t       *next;     /* 下一个节点指针，用户不能摆弄，否则gg */
};

#ifdef __cplusplus  
extern "C" {  
#endif  /* __cplusplus */

/*******************************************************************************
** 函数名称：soft_timer_mgr_init
** 函数作用：初始化定时器管理器
** 输入参数：无
** 输出参数：无
** 使用样例：soft_timer_mgr_init();
** 函数备注：
*******************************************************************************/
void soft_timer_mgr_init(void);
void soft_timer_mgr_destroy(void);

/*******************************************************************************
** 函数名称：soft_timer_get_list_head
** 函数作用：获取定时器头
** 输入参数：无
** 输出参数：定时器头指针
** 使用范例：soft_timer_get_list_head();
** 函数备注：
*******************************************************************************/
soft_timer_t *soft_timer_get_list_head(void);

/*******************************************************************************
** 函数名称：soft_timer_init
** 函数作用：初始化
** 输入参数：ptimer - 定时器指针
**           mode - 模式
**           times - 运行次数，仅多次模式下有效
**           interval - 触发时间间隔
**           cb - 回调
** 输出参数：是否成功
** 使用样例：soft_timer_init(&tim, SOFT_TIMER_MODE_ONCE, 0, 100, SOFT_NULL);
** 函数备注：此函数会将初始化后的定时器插入系统链表，但不会启动定时器
*******************************************************************************/
bool soft_timer_init(soft_timer_t *ptimer,
                   soft_timer_mode_t mode,
                   soft_timer_base_t times,
                   soft_timer_base_t interval_ms,
                   soft_timer_cb_t *cb);

/*******************************************************************************
** 函数名称：soft_timer_remove
** 函数作用：从链表移除定时器
** 输入参数：ptimer - 定时器指针
** 输出参数：是否成功
** 使用样例：soft_timer_remove(ptimer);
** 函数备注：定时器非法或不在链表会返回失败
*******************************************************************************/
bool soft_timer_remove(soft_timer_t* ptimer);

/*******************************************************************************
** 函数名称：soft_timer_start
** 函数作用：启动定时器
** 输入参数：ptimer - 定时器指针
** 输出参数：无
** 使用样例：soft_timer_start();
** 函数备注：
*******************************************************************************/
bool soft_timer_start(soft_timer_t* ptimer);

/*******************************************************************************
** 函数名称：soft_timer_stop
** 函数作用：停止定时器
** 输入参数：ptimer - 定时器指针
** 输出参数：无
** 使用样例：soft_timer_stop();
** 函数备注：
*******************************************************************************/
bool soft_timer_stop(soft_timer_t* ptimer);

/*******************************************************************************
** 函数名称：soft_timer_poll_event
** 函数作用：定时器事件轮询处理
** 输入参数：无
** 输出参数：无
** 使用样例：soft_timer_poll_event();
** 函数备注：
*******************************************************************************/
void soft_timer_poll_event(void);

/*******************************************************************************
** 函数名称：soft_timer_get_ticks
** 函数作用：获取系统ticks总数
** 输入参数：无
** 输出参数：ticks
** 使用样例：soft_timer_get_ticks();
** 函数备注：
*******************************************************************************/
soft_timer_base_t soft_timer_get_ticks(void);

/*******************************************************************************
** 函数名称：soft_timer_inc_ticks
** 函数作用：定时器ticks自增
** 输入参数：无
** 输出参数：无
** 使用样例：soft_timer_inc_ticks();
** 函数备注：此函数一般放在硬件定时器定时中断中执行，定时周期推荐1ms
*******************************************************************************/
void soft_timer_inc_ticks(void);

#ifdef __cplusplus
}
#endif  /* __cplusplus */

#endif  /* __SOFT_TIMER_H__ */
